package com.sky.common.docker;

import com.sky.common.docker.build.ContainerTemplate;
import com.sky.common.docker.container.ContainerInfo;
import com.sky.common.docker.container.ContainerStateInfo;
import com.sky.common.docker.container.ImageInfo;
import com.sky.common.enums.ContainerStatus;

import java.util.List;

/**
 * 容器操作接口
 *
 */
public interface ContainerOperateService {

    /**
     * 创建容器
     * @param client 容器客户端连接
     * @param containerTemplate 容器配置
     * @return 容器id
     */
    String create(ContainerClient client, ContainerTemplate containerTemplate);

    /**
     * 启动容器
     * @param client 容器客户端连接
     * @param containerId 容器id
     */
     void start(ContainerClient client, String containerId);

    /**
     * 停止容器
     * @param client 容器客户端连接
     * @param containerId 容器id
     */
     void stop(ContainerClient client,String containerId);

    /**
     * 重启容器
     * @param client  容器客户端连接
     * @param containerId 容器id
     */
    void restart(ContainerClient client,String containerId);

    /**
     * 删除容器
     * @param client 容器客户端连接
     * @param containerId 容器id
     * @param force 是否强制
     */
     void  remove(ContainerClient client,String containerId,boolean force);

    /**
     * 杀掉容器的进程
     * @param client 容器客户端连接
     * @param containerId 容器id
     */
     void  kill(ContainerClient client,String containerId);

    /**
     * 暂停容器
     * @param client  容器客户端连接
     * @param containerId 容器id
     */
    void pause(ContainerClient client,String containerId);

    /**
     *  回复容器
     * @param client 容器客户端连接
     * @param containerId 容器id
     */
    void unpause(ContainerClient client,String containerId);

    /**
     *  查看容器状态信息
     * @param client 容器客户端连接
     * @param containerId 容器id
     * @return 容器状态信息
     */
     ContainerStateInfo inspect(ContainerClient client, String containerId);

    /**
     * 查看所有的容器
     * @param client  容器客户端连接
     * @return 容器列表
     */
     List<ContainerInfo> listAll(ContainerClient client);


    /**
     * 查看指定状态的容器
     * @param client 容器客户端连接
     * @param statuses 状态数组
     * @return 容器列表
     */
    List<ContainerInfo> listByStatus(ContainerClient  client, ContainerStatus[] statuses);


    /**
     * 拉取镜像
     * @param client 容器客户端连接
     * @param name  镜像名称
     * @param tag   镜像标签
     */
    void pullImage(ContainerClient  client, String name, String tag) throws InterruptedException;


    /**
     * 返回所有镜像列表
     * @param containerClient 容器客户端连接
     * @return 镜像列表
     */
    List<ImageInfo> listImages(ContainerClient containerClient);
}
